package com.ruoyi.pcj.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mashuai.utils.base.MsAssertUtils;
import com.mashuai.utils.toolkit.core.msMp.MsDb;
import com.ruoyi.basis.service.MsBaseServiceImpl;
import com.ruoyi.basis.utils.mp.MpConditionUtils;
import com.ruoyi.basis.utils.mp.MpPageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.pcj.constant.TipConstant;
import com.ruoyi.pcj.domain.PcjLtFriendList;
import com.ruoyi.pcj.mapper.PcjLtFriendListMapper;
import com.ruoyi.pcj.service.IPcjLtFriendListService;
import com.ruoyi.pcj.service.IPcjLtFriendSettingService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 聊天-好友列Service业务层处理
 *
 * @author ms
 * @date 2024-03-13
 */
@AllArgsConstructor
@Service
public class PcjLtFriendListServiceImpl extends MsBaseServiceImpl<PcjLtFriendListMapper, PcjLtFriendList> implements IPcjLtFriendListService {

    @Override
    public <E extends IPage<PcjLtFriendList>> E page(E page, Wrapper<PcjLtFriendList> qw) {
        return baseMapper.selectPage(page, qw);
    }

    private IPcjLtFriendSettingService friendSettingService;

    /**
     * 查询聊天-好友列列表
     *
     * @param params 聊天室-查询参数 {"pageNum":1,"pageSize":10}
     * @return 聊天-好友列
     */
    @Override
    public IPage<PcjLtFriendList> selectPcjLtFriendListList(Map<String, Object> params) {
        //获取条件构造器
        QueryWrapper<PcjLtFriendList> qw = MpConditionUtils.getQueryWrapper(params, PcjLtFriendList.class);
        //分页查询
        Page<PcjLtFriendList> page = this.page(MpPageUtils.getPage(params), qw);
        return page;
    }


    /**
     * 根据id查询聊天-好友列
     *
     * @param id 聊天-好友列主键
     * @return 聊天-好友列
     */
    @Override
    public PcjLtFriendList selectPcjLtFriendListById(String id) {
        //首先获取主表信息
        PcjLtFriendList pcjLtFriendList = MsDb.getById(id, PcjLtFriendList.class);
        return pcjLtFriendList;
    }

    /**
     * 回填子表信息
     **/

    /**
     * 新增聊天-好友列
     *
     * @param pcjLtFriendList 聊天-好友列
     * @return 结果
     */
    @Override
    public Boolean insertPcjLtFriendList(PcjLtFriendList pcjLtFriendList) {
        //插入主表
        Boolean success = this.insertData(pcjLtFriendList);
        return success;
    }

    /**
     * 修改聊天-好友列
     *
     * @param pcjLtFriendList 聊天-好友列
     * @return 结果
     */
    @Override
    public Boolean updatePcjLtFriendList(PcjLtFriendList pcjLtFriendList) {
        //修改主表
        Boolean success = this.updateData(pcjLtFriendList);
        return success;
    }

    /**
     * 批量删除聊天-好友列
     *
     * @param ids 需要删除的聊天-好友列主键
     * @return 结果
     */
    @Override
    public Boolean deletePcjLtFriendListByIds(String[] ids) {

        //删除主表
        Boolean success = this.removeBatchByIds(Arrays.asList(ids));
        return success;
    }
    /**
     * 根据主表id，删除子表所有数据
     **/
    /**
     * 对外提供的设置默认字段值，id为空新增，不为空更新
     **/
    @Override
    public void setEntityDefValAuto(PcjLtFriendList pcjLtFriendList) {
        this.setDefFieldVal(pcjLtFriendList);
    }

    @Override
    public List<PcjLtFriendList> getFirendList(Long userId) {
        LambdaQueryWrapper<PcjLtFriendList> qw = Wrappers.lambdaQuery();
        qw.eq(PcjLtFriendList::getUserId, userId);
        List<PcjLtFriendList> friendLists = baseMapper.selectList(qw);
        return friendLists;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public PcjLtFriendList addFriend(Long friendId) {
        Long userId = SecurityUtils.getUserId();
        MsAssertUtils.objIsNull(friendId, TipConstant.NO_PARAMS);
        //禁止重复添加好友，双向的
        PcjLtFriendList friendData = getFriendData(userId, friendId);
        if (friendData != null) {
            MsAssertUtils.throwException("好友已存在，请勿重复添加");
        }
        //添加好友，先pcj_lt_friend_list插入，
        PcjLtFriendList entity = insertFriendData(userId, friendId);
        return entity;
    }


    @Override
    public PcjLtFriendList getFriendByChat(Long userId, Long friendId) {
        MsAssertUtils.objIsNulls(userId, friendId);
        //判断是否已经进行好友绑定
        PcjLtFriendList friendData = getFriendData(userId, friendId);
        //如果好友被删除，不允许发送消息，未被删除，直接返回当前信息
        if (friendData != null) {
            if (1 == friendData.getDelFlag()) {
                MsAssertUtils.throwException("好友已经删除，不可发送消息！");
            }
            return friendData;
        }
        //初次聊天，绑定好友关系
        PcjLtFriendList entity = insertFriendData(userId, friendId);
        return entity;
    }

    /**
     * 绑定好友关系
     **/
    private PcjLtFriendList insertFriendData(Long userId, Long friendId) {
        //添加好友，先pcj_lt_friend_list插入，
        PcjLtFriendList entity = new PcjLtFriendList();
        // 默认为陌生关系
        entity.setUserId(userId);
        entity.setFriendId(friendId);
        entity.setStatus("0");
        this.insertData(entity);
        //在给pcj_lt_friend_setting添加两条记录，用户对方单独设置某些属性
        //friendSettingService.addFriendSetting(entity);
        return entity;
    }

    /**
     * 获取朋友数据。双向。这里不做del_flag = 0的筛选，如果号好友被删除，则提示用户好友不存在（防止直接调发信息接口，如果正常从会话发送消息，不会出现）
     *
     * @param userId
     * @param friendId
     */
    @Override
    public PcjLtFriendList getFriendData(Long userId, Long friendId) {
        PcjLtFriendList entity = baseMapper.getFriendData(userId, friendId);
        return entity;
    }

//    @Override
//    public List<PcjLtFriendList> getFriendList() {
//        Long userId = SecurityUtils.getUserId();
//        //获取当前好友的列表信息
//
//        return null;
//    }
}
